<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>test</title>
<script>


//【示例1】函数的引用和调用。

var o = {
    name : "对象o",
    f : function(){
        return this;
    }
}
o.o1 = {
    name : "对象o1",
    me : o.f				// 引用对象o的方法f
}

var who = o.o1.me();
alert(who.name); 			// 返回字符串"对象o1"，说明当前this代表对象o1

o.o1 = {
    name : "对象o1",
    me : o.f()				// 调用对象o的方法f
}

var who = o.o1.me;
alert(who.name); 			// 返回字符串"对象o"，说明当前this代表对象o
//【示例2】使用call()和apply()。

function f(){
    // 如果当前执行域对象的构造函数等于当前函数，则表示this为实例对象
    if(this.constructor == arguments.callee) alert("this = 实例对象");
    // 如果当前执行域对象等于window，则表示this为Window对象
    else if (this == window) alert("this = window对象");
    // 如果当前执行域对象为其他对象，则表示this为其他对象
    else alert("this == 其他对象 \nthis.constructor = " + 
this.constructor );
}
f();							// this指向Window对象
new f();						// this指向实例对象
f.call(1); 						// this指向数值实例对象

function f(){					// 函数f()
    alert(this.x + this.y);
}
var o = {						// 对象直接量
    x : 1,
    y : 2
}
f.call(o); 						// 执行函数f()，返回值为3
//【示例3】原型继承。

function Base(){				// 基类
    this.m = function(){		// 基类的方法m()
        return "Base";
    };
    this.a = this.m();			// 基类的属性a，调用当前作用域中m()方法
    this.b = this.m; 			// 基类的方法b()，引用当前作用域中m()方法
    this.c = function(){
	// 基类的方法c()，以闭包结构用当前作用域中m()方法
        return this.m();
    } 
}	
function F(){					// 子类
    this.m = function(){		// 子类的方法m()
        return "F"
    }
}
F.prototype = new Base();		// 继承基类
var f = new F();				// 实例化子类
alert(f.a); 	// 返回字符串"Base"，说明this.m()中this指向F的原型对象
alert(f.b());	// 返回字符串"Base"，说明this.m()中this指向F的原型对象
alert(f.c());	// 返回字符串"F"，说明this.m()中this指向F的实例对象


function Base(){
    var _m = function(){					// 定义基类的私有函数_m()
        return "Base";
    };
    this.a = _m;
    this.b = _m();
}

//【示例5】异步调用之定时器。
var o ={};
o.f = function(){
    if(this == o) alert("this = o");
    if(this == window) alert("this = window");
    if(this == button) alert("this = button");
}
setTimeout(o.f, 100);

setTimeout(function(){
    o.f.call(o);
}, 100);


</script>
</head>
<body>

//【示例4】异步调用之事件处理函数。
异步调用就是通过事件机制或者计时器来延迟函数的调用时间和时机。通过调用函数的执行作用域不再是原来的定义作用域，所以函数中的this总是指向引发该事件的对象。
<input type="button" value="Button" />
<script language="javascript" type="text/javascript">
var button = document.getElementsByTagName("input")[0];
var o ={};
o.f = function(){
    if(this == o) alert("this = o");
    if(this == window) alert("this = window");
    if(this == button) alert("this = button");
}
button.onclick = o.f;
</script>


</body>
</html>
